#include "Diccionario.h"

Diccionario::Diccionario(){
	this->entradas = new Lista<Entrada>();
	this->entradas->setComparador(new ComparadorEntradas());
}

void Diccionario::put(const string& clave, const string& valor){
	Entrada* nuevaEntrada;
	Entrada* entradaExistente;

	//creo un nuevo string con la clave
	string claveUpper(clave);

	//lo paso a mayusculas
	transform(claveUpper.begin(), claveUpper.end(), claveUpper.begin(), (int(*)(int))toupper);

	//creo una hipotetica nueva entrada
	nuevaEntrada = new Entrada(claveUpper, valor);

	//busco una entrada que coincida con la clave recibida
	entradaExistente = this->entradas->buscar(nuevaEntrada);

	//si no existe la creo y almaceno, de lo contrario, actualizo el valor de la entrada encontrada
	if(entradaExistente == NULL)
		this->entradas->agregar(nuevaEntrada);
	else{
		//actualizo el valor de la entrada encontrada
		entradaExistente->setValor(nuevaEntrada->getValor());
		
		//libero la memoria de la entrada auxiliar
		delete nuevaEntrada;
	}
}

string* const Diccionario::get(const string& clave){
	Entrada* entradaAuxiliar;
	Entrada* entradaBuscada;
	string* valorBuscado;

	//creo un nuevo string con la clave
	string claveUpper(clave);

	//lo paso a mayusculas
	transform(claveUpper.begin(), claveUpper.end(), claveUpper.begin(), (int(*)(int))toupper);

	//creo una entrada auxiliar para buscar la entrada correspondiente a la clave
	entradaAuxiliar = new Entrada(claveUpper, "aux");

	//busco la entrada correspondiente a la clave recibida
	entradaBuscada = this->entradas->buscar(entradaAuxiliar);

	//si la encontre obtengo el valor (de lo contrario devuelvo NULL)
	if(entradaBuscada != NULL)
		valorBuscado = new string(entradaBuscada->getValor());
	else
		valorBuscado = NULL;

	//libero la memoria usada para la entrada auxiliar
	delete entradaAuxiliar;

	//devuelvo el valor buscado o NULL si no pude encontrarlo
	return valorBuscado;
}

Lista<Entrada>* Diccionario::getEntradas(){
	return this->entradas;
}

Diccionario::~Diccionario(){
	delete this->entradas;
}